{
  //声明一个类之后, 会产生一个新的『类型』, 类型的名字跟类名一样
  class Computer{
    //属性
    brand: string;
    color: string;
    price: number;

    //方法
    constructor(brand: string, color: string, price: number){
      this.brand = brand;
      this.color = color;
      this.price = price;
    }

    learn(){
      console.log('我可以用来学习~~~');
    }
  }

  //实例化 Computer 的类型要求 zjz 变量对象要包含 Computer 类中的属性以及方法
  // let zjz: Computer = new Computer('拯救者', '深灰', 9999);
  // let zjz = new Computer('xxx', '红色', 5862);

  //访问属性
  // console.log(zjz.price);
  // zjz.learn();


  //声明一个子类
  class Laptop extends Computer {
    //属性 -> 成员属性
    size: string;
    memory: string;
    cpu: string;

    //构造方法
    constructor(brand: string, color: string, price: number, size: string, memory:string, cpu: string){
      //调用父类的构造方法
      super(brand, color, price);
      //对子类属性进行初始化
      this.size = size;
      this.memory = memory;
      this.cpu = cpu;
    }

    //成员方法
    learn = () => {
      console.log('learn learn learn');
    }
  }

  //实例化
  let lenove = new Laptop('联想', '黑色', 15699, '16inch', '32G', 'i7 11700H');

  lenove.learn();
  

}


{
  class A{
    //公开的属性, 谁都可以访问, 在哪儿都可以访问
    public propA: string = 'AAA';
    //受保护的属性, 该属性只能『在本类以及子类内部方法中』使用.
    protected propB: string = 'BBB';
    //私有的属性, 该属性值能在『本类内部的方法』使用
    private propC: String = 'CCC';

    fn2(){
      //访问公开的属性
      // console.log(this.propA);
      // console.log(this.propB);
      console.log(this.propC);
    }
  }

  class B extends A{
    fn(){
      //访问公开的属性 propA 
      // console.log(this.propA);
      // console.log(this.propB);
      // console.log(this.propC);// X 不能访问父类的私有属性
    }
  }

  let b = new B();

  //public 成员
  // console.log(b.propA);
  //protected 成员. 类外部不能访问 protected 修饰的成员
  // console.log(b.propB); //属性“propB”受保护，只能在类“A”及其子类中访问
  //private 成员
  // console.log(b.propC); //属性“propC”为私有属性，只能在类“A”中访问
  b.fn();
  b.fn2();



}